filterlistmodel: Add gtk_filter_list_model_get_pending()
authorBenjamin Otte <otte@redhat.com>
Tue, 30 Jun 2020 02:01:39 +0000 (04:01 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 6 Jul 2020 01:42:43 +0000 (03:42 +0200)
This allows tracking if the model is busy filtering.

docs/reference/gtk/gtk4-sections.txt
gtk/gtkfilterlistmodel.c
gtk/gtkfilterlistmodel.h

index 4016e3847bb5206c28dc67b659a66578836c9984..f3a303e5f090b0c73fa540671859de7dccc89dca 100644 (file)
@@ -1549,6 +1549,7 @@ gtk_filter_list_model_set_filter
 gtk_filter_list_model_get_filter
 gtk_filter_list_model_set_incremental
 gtk_filter_list_model_get_incremental
+gtk_filter_list_model_get_pending
 <SUBSECTION Standard>
 GTK_FILTER_LIST_MODEL
 GTK_IS_FILTER_LIST_MODEL
index 6078673a25368082d4ba23ce4ff1053012e5c7d9..9ef3545e856b3a2034f561d310b4fa0751681bfc 100644 (file)
@@ -46,6 +46,7 @@ enum {
   PROP_FILTER,
   PROP_INCREMENTAL,
   PROP_MODEL,
+  PROP_PENDING,
   NUM_PROPERTIES
 };
 
@@ -180,6 +181,7 @@ gtk_filter_list_model_run_filter (GtkFilterListModel *self,
     gtk_bitset_remove_range_closed (self->pending, 0, pos);
   else
     g_clear_pointer (&self->pending, gtk_bitset_unref);
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
 
   return;
 }
@@ -187,8 +189,13 @@ gtk_filter_list_model_run_filter (GtkFilterListModel *self,
 static void
 gtk_filter_list_model_stop_filtering (GtkFilterListModel *self)
 {
+  gboolean notify_pending = self->pending != NULL;
+
   g_clear_pointer (&self->pending, gtk_bitset_unref);
   g_clear_handle_id (&self->pending_cb, g_source_remove);
+
+  if (notify_pending)
+    g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
 }
 
 static void
@@ -240,6 +247,7 @@ gtk_filter_list_model_start_filtering (GtkFilterListModel *self,
     {
       gtk_bitset_union (self->pending, items);
       gtk_bitset_unref (items);
+      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
       return;
     }
 
@@ -258,6 +266,7 @@ gtk_filter_list_model_start_filtering (GtkFilterListModel *self,
       return;
     }
 
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PENDING]);
   g_assert (self->pending_cb == 0);
   self->pending_cb = g_idle_add (gtk_filter_list_model_run_filter_cb, self);
   g_source_set_name_by_id (self->pending_cb, "[gtk] gtk_filter_list_model_run_filter_cb");
@@ -361,6 +370,10 @@ gtk_filter_list_model_get_property (GObject     *object,
       g_value_set_object (value, self->model);
       break;
 
+    case PROP_PENDING:
+      g_value_set_uint (value, gtk_filter_list_model_get_pending (self));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -560,6 +573,18 @@ gtk_filter_list_model_class_init (GtkFilterListModelClass *class)
                            G_TYPE_LIST_MODEL,
                            GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
 
+  /**
+   * GtkFilterListModel:pending:
+   *
+   * Number of items not yet filtered
+   */
+  properties[PROP_PENDING] =
+      g_param_spec_uint ("pending",
+                         P_("Pending"),
+                         P_("Number of items not yet filtered"),
+                         0, G_MAXUINT, 0,
+                         GTK_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
 }
 
@@ -783,3 +808,29 @@ gtk_filter_list_model_get_incremental (GtkFilterListModel *self)
 
   return self->incremental;
 }
+
+/**
+ * gtk_filter_list_model_get_pending:
+ * @self: a #GtkFilterListModel
+ *
+ * Returns the number of items that have not been filtered yet.
+ *
+ * When incremental filtering is not enabled, this always returns 0.
+ *
+ * You can use this value to check if @self is busy filtering by
+ * comparing the return value to 0 or you can compute the percentage
+ * of the filter remaining by dividing the return value by
+ * g_list_model_get_n_items(gtk_filter_list_model_get_model (self)).
+ *
+ * Returns: The number of items not yet filtered
+ **/
+guint
+gtk_filter_list_model_get_pending (GtkFilterListModel *self)
+{
+  g_return_val_if_fail (GTK_IS_FILTER_LIST_MODEL (self), FALSE);
+
+  if (self->pending == NULL)
+    return 0;
+
+  return gtk_bitset_get_size (self->pending);
+}
index 6dfb82ffeed8528e2c2f573764109d3d8189d7e7..35913c1836086388ce1e8bed3c55aed7847ab2c0 100644 (file)
@@ -55,6 +55,8 @@ void                    gtk_filter_list_model_set_incremental   (GtkFilterListMo
                                                                  gboolean                incremental);
 GDK_AVAILABLE_IN_ALL
 gboolean                gtk_filter_list_model_get_incremental   (GtkFilterListModel     *self);
+GDK_AVAILABLE_IN_ALL
+guint                   gtk_filter_list_model_get_pending       (GtkFilterListModel     *self);
 
 
 G_END_DECLS